home *** CD-ROM | disk | FTP | other *** search
/ Hardcore Visual Basic 5.0 (2nd Edition) / Hardcore Visual Basic 5.0 - Second Edition (1997)(Microsoft Press).iso / Code / regnode.cls < prev    next >
Text File  |  1997-06-14  |  10KB  |  359 lines

  1. VERSION 1.0 CLASS
  2. BEGIN
  3.   MultiUse = -1  'True
  4. END
  5. Attribute VB_Name = "CRegNode"
  6. Attribute VB_GlobalNameSpace = False
  7. Attribute VB_Creatable = True
  8. Attribute VB_PredeclaredId = False
  9. Attribute VB_Exposed = True
  10. Option Explicit
  11.    
  12. Public Enum EErrorRegNode
  13.     eeBaseRegNode = 13180   ' CRegNode
  14. End Enum
  15.  
  16. Private hKey As Long
  17. Private sName As String
  18. Private afAccess As Long
  19. Private cItem As Long, cNode As Long
  20.  
  21. ' Create
  22. 'RegOpenKeyEx
  23. 'RegCloseKey
  24.  
  25. ' Connect
  26. 'RegConnectRegistry
  27.  
  28. ' Enumerate
  29. 'RegEnumKeyEx
  30.  
  31. Sub Create(vIndex As Variant, _
  32.            Optional RootKey As Long = HKEY_CURRENT_USER, _
  33.            Optional AccessRights As Long = KEY_ALL_ACCESS)
  34.     Dim e As Long, hKeyRoot As Long
  35.     hKeyRoot = RootKey
  36.     afAccess = AccessRights
  37.     Select Case VarType(vIndex)
  38.     Case vbString
  39.         sName = vIndex
  40.         ' Key is a key name
  41.         e = RegOpenKeyEx(hKeyRoot, sName, 0&, afAccess, hKey)
  42.         ApiRaiseIf e
  43.         
  44.     Case vbInteger, vbLong
  45.         ' Index is a handle
  46.         e = MRegTool.GetRegNodeNext(hKeyRoot, CLng(vIndex), sName)
  47.         ApiRaiseIf e
  48.     
  49.     Case Else
  50.         ApiRaise ERROR_INVALID_DATA
  51.         
  52.     End Select
  53.  
  54. End Sub
  55.  
  56. Private Sub Class_Initialize()
  57.     afAccess = KEY_ALL_ACCESS
  58.     hKey = HKEY_CURRENT_USER
  59.     cItem = -1
  60.     cNode = -1
  61. End Sub
  62.  
  63. ' Destroy
  64. 'RegCloseKey
  65.  
  66. Private Sub Class_Terminate()
  67.     If hKey = 0 Then Exit Sub
  68.     ApiRaiseIf RegCloseKey(hKey)
  69. End Sub
  70.  
  71. ' NewEnum must have the procedure ID -4 in Procedure Attributes dialog
  72. ' Create a new data walker object and connect to it
  73. Public Function NewEnum() As IEnumVARIANT
  74. Attribute NewEnum.VB_UserMemId = -4
  75.     ' Create a new iterator object
  76.     Dim walker As CRegNodeWalker
  77.     Set walker = New CRegNodeWalker
  78.     ' Connect it with collection data
  79.     walker.Attach Me
  80.     ' Return it
  81.     Set NewEnum = walker.NewEnum
  82. End Function
  83.  
  84. '!Public Property Get Item(vIndex As Variant) '! As DataType
  85.     '!Set Item = data(vIndex)
  86. '!End Property
  87.  
  88. Property Get Name() As String
  89.     Name = sName
  90. End Property
  91.  
  92. Friend Property Let Name(sNameA As String)
  93.     sName = sNameA
  94. End Property
  95.  
  96. Property Get Key(Optional RootKey As Long = -1) As Variant
  97.     ' Ignore RootKey
  98.     Key = hKey
  99. End Property
  100.  
  101. ' Ways of initializing a node
  102. ' Open HKEY_CLASSES_ROOT key
  103. '   node.Key = HKEY_CLASSES_ROOT
  104. ' Open Software key
  105. '   node.Key(HKEY_LOCAL_MACHINE) = "Software"
  106. ' Open Software key in default root HKEY_CURRENT_USER
  107. '   node.Key = "Software"
  108. ' Open next key of current key
  109. '   node.Key(hKey) = iNode
  110.  
  111. Property Let Key(Optional RootKey As Long = -1, vKey As Variant)
  112.     Dim e As Long
  113.     If VarType(vKey) = vbString Then
  114.         If RootKey = -1 Then RootKey = hKey
  115.         sName = vKey
  116.         ' Key is a key name
  117.         e = RegOpenKeyEx(RootKey, sName, pNull, afAccess, hKey)
  118.     Else
  119.         If RootKey = -1 Then
  120.             ' Ignore any hRootKey, key is the root handle
  121.             hKey = CLng(vKey)
  122.             e = RegOpenKeyEx(hKey, sNullStr, pNull, afAccess, hKey)
  123.             Select Case hKey
  124.             Case HKEY_CLASSES_ROOT
  125.                 sName = "HKEY_CLASSES_ROOT"
  126.             Case HKEY_CURRENT_USER
  127.                 sName = "HKEY_CURRENT_USER"
  128.             Case HKEY_LOCAL_MACHINE
  129.                 sName = "HKEY_LOCAL_MACHINE"
  130.             Case HKEY_USERS
  131.                 sName = "HKEY_USERS"
  132.             Case HKEY_CURRENT_CONFIG
  133.                 sName = "HKEY_CURRENT_CONFIG"
  134.             Case HKEY_PERFORMANCE_DATA
  135.                 sName = "HKEY_PERFORMANCE_DATA"
  136.             Case HKEY_DYN_DATA
  137.                 sName = "HKEY_DYN_DATA"
  138.             Case Else
  139.                 ' Query for name
  140.             End Select
  141.         Else
  142.             ' Key is the iteration index
  143.             e = MRegTool.GetRegNodeNext(RootKey, CLng(vKey), sName)
  144.             ApiRaiseIf e
  145.             e = RegOpenKeyEx(RootKey, sName, pNull, afAccess, hKey)
  146.         End If
  147.     End If
  148.     ApiRaiseIf e
  149. End Property
  150.  
  151. ' Only for use by AddNode
  152. Friend Function SetKey(hKeyA As Long)
  153.     hKey = hKeyA
  154. End Function
  155.  
  156. Property Get Access() As Long
  157.     Access = afAccess
  158. End Property
  159.  
  160. Property Let Access(afAccessA As Long)
  161.     ' Mask out any invalid flags
  162.     afAccess = afAccessA And KEY_ALL_ACCESS
  163. End Property
  164.  
  165. ' Get/Set Property
  166. 'RegQueryValue
  167. 'RegQueryValueEx
  168. 'RegSetValue
  169. 'RegSetValueEx
  170.  
  171. Property Get Value() As Variant
  172.     Value = Items(sEmpty).Value
  173. End Property
  174.  
  175. Property Let Value(vValueA As Variant)
  176.     Items(sEmpty).Value = vValueA
  177. End Property
  178.  
  179. ' Summary
  180. 'RegQueryInfoKey
  181.  
  182. Property Get ItemCount() As Long
  183.     If cItem <> -1 Then
  184.         ItemCount = cItem
  185.     Else
  186.         Dim e As Long, sJunk As String, cJunk As Long, cClsNM As Long
  187.         Dim cNodeNM As Long, cItemNM As Long, cItemM As Long
  188.         Dim ft As FILETIME
  189.         e = RegQueryInfoKey(hKey, sNullStr, cJunk, pNull, cNode, _
  190.                             cNodeNM, cJunk, cItem, cItemNM, cItemM, _
  191.                             cJunk, ft)
  192.         ApiRaiseIf e
  193.         ItemCount = cItem
  194.     End If
  195. End Property
  196.  
  197. Property Get NodeCount() As Long
  198.     If cNode <> -1 Then
  199.         NodeCount = cNode
  200.     Else
  201.         Dim e As Long, sJunk As String, cJunk As Long, cClsNM As Long
  202.         Dim cNodeNM As Long, cItemNM As Long, cItemM As Long
  203.         Dim ft As FILETIME
  204.         e = RegQueryInfoKey(hKey, sNullStr, cJunk, pNull, _
  205.                             cNode, cNodeNM, cJunk, _
  206.                             cItem, cItemNM, cItemM, cJunk, ft)
  207.         ApiRaiseIf e
  208.         NodeCount = cNode
  209.     End If
  210. End Property
  211.  
  212. ' Nodes and items
  213.  
  214. Function Nodes(vIndexA As Variant) As CRegNode
  215. Attribute Nodes.VB_UserMemId = 0
  216.     Dim node As CRegNode, e As Long, s As String
  217.     Set node = New CRegNode
  218.     node.Key(hKey) = vIndexA
  219.     Set Nodes = node
  220. End Function
  221.  
  222. Function Items(Optional Index As Variant) As CRegItem
  223.     Dim Item As CRegItem
  224.     Set Item = New CRegItem
  225.     If IsMissing(Index) Then Index = sEmpty
  226.     Item.Create Me, Index
  227.     Set Items = Item
  228. End Function
  229.  
  230. Friend Function BaseNode() As CRegNode
  231.     Set BaseNode = Me
  232. End Function
  233.  
  234. ' Add/Delete Node
  235. 'RegCreateKey
  236. 'RegCreateKeyEx
  237. 'RegDeleteKey
  238. Function AddNode(sNameA As String) As CRegNode
  239.     Dim e As Long, ordResult As Long, hKeyRes As Long
  240.     e = RegCreateKeyEx(hKey, sNameA, 0&, sEmpty, REG_OPTION_NON_VOLATILE, _
  241.                        afAccess, pNull, hKeyRes, ordResult)
  242.     ApiRaiseIf e
  243.     Dim nodeT As CRegNode
  244.     Set nodeT = New CRegNode
  245.     nodeT.Access = afAccess
  246.     nodeT.SetKey hKeyRes
  247.     nodeT.Name = sNameA
  248.     Set AddNode = nodeT
  249. End Function
  250.  
  251. Function RemoveNode(vNode As Variant, _
  252.                     Optional AllChild = True) As Boolean
  253.     Dim e As Long
  254.     If AllChild Then
  255.         e = MRegTool.DeleteRegNodes(hKey, Nodes(vNode).Name)
  256.     Else
  257.         e = MRegTool.DeleteOneRegNode(hKey, Nodes(vNode).Name)
  258.     End If
  259.     ' Translate failure to delete node with children to false return
  260.     Select Case e
  261.     Case 0
  262.         RemoveNode = True
  263.     Case ERROR_ACCESS_DENIED
  264.         RemoveNode = False
  265.     Case Else
  266.         ApiRaiseIf e
  267.     End Select
  268. End Function
  269.  
  270. ' Add/Delete Item
  271. 'RegSetValueEx
  272. 'RegDeleteValue
  273. Sub AddItem(vValue As Variant, Optional ItemName As String)
  274.     Dim e As Long
  275.     e = MRegTool.CreateRegValue(vValue, hKey, ItemName)
  276.     ApiRaiseIf e
  277. End Sub
  278.  
  279. Sub RemoveItem(Optional Index As Variant)
  280.     Dim e As Long, sName As String
  281.     sName = Items(Index).Name
  282.     e = RegDeleteValue(hKey, sName)
  283.     ApiRaiseIf e
  284. End Sub
  285.  
  286. Function WalkNodes(use As IUseRegItems, _
  287.                    ByVal iLevel As Long) As CRegNode
  288. #If 1 Then
  289.     Dim i As Long
  290.     For i = 0 To NodeCount - 1
  291.         If use.UseNode(Nodes(i), iLevel + 1) Then
  292.             Set WalkNodes = Nodes(i)
  293.             Exit Function
  294.         End If
  295.     Next
  296. #Else
  297.     Dim node As CRegNode
  298.     For Each node In Me
  299.         If use.UseNode(node, iLevel + 1) Then
  300.             Set WalkNodes = node
  301.             Exit Function
  302.         End If
  303.     Next
  304. #End If
  305. End Function
  306.  
  307. Function WalkItems(use As IUseRegItems, _
  308.                    ByVal iLevel As Long) As CRegItem
  309.     Dim i As Long
  310.     For i = 0 To ItemCount - 1
  311.         If use.UseItem(Items(i), iLevel + 1) Then
  312.             Set WalkItems = Items(i)
  313.             Exit Function
  314.         End If
  315.     Next
  316. End Function
  317.  
  318. Function WalkAllNodes(use As IUseRegItems, nodeStart As CRegNode, _
  319.                       ByVal iLevel As Long) As CRegNode
  320.     If use.UseNode(nodeStart, iLevel) Then
  321.         Set WalkAllNodes = nodeStart
  322.         Exit Function
  323.     End If
  324.     Dim i As Long, nodeT As CRegNode
  325.     ' Iterate by index for greater speed
  326.     For i = 0 To nodeStart.NodeCount - 1
  327.         Set WalkAllNodes = WalkAllNodes(use, nodeStart.Nodes(i), _
  328.                                         iLevel + 1)
  329.     Next
  330. End Function
  331.  
  332. ' Write to and from file
  333. 'RegSaveKey
  334. 'RegRestoreKey
  335. 'RegReplaceKey
  336. 'RegLoadKey
  337. 'RegUnLoadKey
  338.  
  339. #If fComponent = 0 Then
  340. Private Sub ErrRaise(e As Long)
  341.     Dim sText As String, sSource As String
  342.     If e > 1000 Then
  343.         sSource = App.ExeName & ".RegNode"
  344.         Select Case e
  345.         Case eeBaseRegNode
  346.             BugAssert True
  347.        ' Case ee...
  348.        '     Add additional errors
  349.         End Select
  350.         Err.Raise COMError(e), sSource, sText
  351.     Else
  352.         ' Raise standard Visual Basic error
  353.         sSource = App.ExeName & ".VBError"
  354.         Err.Raise e, sSource
  355.     End If
  356. End Sub
  357. #End If
  358.  
  359.